﻿namespace extensions.common
{
    /// <summary>
    /// Object 扩展类
    /// </summary>
    public static class ObjectExtension
    {
        /// <summary>
        /// 将当前对象转换到目标数据类型。
        /// 如果原始类型跟目标类型相等，那么支持所有类型的转换，包括自定义类。
        /// 如果不相等，有些转换不支持，比如原始类型是字符串，不能转 Guid、自定义类等
        /// </summary>
        /// <typeparam name="T">目标数据类型</typeparam>
        /// <param name="obj">当前对象</param>
        /// <returns>目标类型对象（如果当前对象为 null，或者转换失败，返回目标类型的默认值）</returns>
        public static T To<T>(this object? obj)
        {
            /*
             * {默认值表}
             * 值类型 => 0
             * string => null
             * char => char.MinValue
             * bool => false
             * DateTime => DateTime.MinValue
             * Guid => Guid.Empty
             */

            if (obj == null) return default!;

            try
            {
                return (T)Convert.ChangeType(obj, typeof(T));
            }
            catch
            {
                return default!;
            }
        }
    }
}
